package cc.cc4414.spring.common.enums;

import cn.hutool.core.util.EnumUtil;
import lombok.experimental.UtilityClass;

import java.util.*;

/**
 * key-value枚举的工具类
 *
 * @author cc 2021年05月17日
 */
@UtilityClass
public class KeyValueEnumUtils {
    /**
     * 获取key-value的map
     *
     * @param enumClass 枚举类
     * @param <E>       枚举类型
     * @param <K>       key的类型
     * @param <V>       value的类型
     * @return {key: value}结构的map
     */
    public <E extends Enum<E> & KeyValueEnum<K, V>, K, V> Map<K, V> getMap(final Class<E> enumClass) {
        Map<String, E> enumMap = EnumUtil.getEnumMap(enumClass);
        Map<K, V> map = new LinkedHashMap<>();
        enumMap.forEach((k, v) -> map.put(v.getCode(), v.getMessage()));
        return map;
    }

    /**
     * 获取列表
     *
     * @param enumClass 枚举类
     * @param <E>       枚举类型
     * @param <K>       key的类型
     * @param <V>       value的类型
     * @return [{key: xxx, value: xxx}]结构的list，其中key和value根据枚举中的字段名确定
     */
    public <E extends Enum<E> & KeyValueEnum<K, V>, K, V> List<Map<String, Object>> getList(final Class<E> enumClass) {
        List<Map<String, Object>> list = new ArrayList<>();
        List<String> fieldNames = EnumUtil.getFieldNames(enumClass);
        Map<String, E> enumMap = EnumUtil.getEnumMap(enumClass);
        enumMap.forEach((k, v) -> {
            Map<String, Object> map = new HashMap<>(2);
            map.put(fieldNames.get(0), v.getCode());
            map.put(fieldNames.get(1), v.getMessage());
            list.add(map);
        });
        return list;
    }
}
